#include <stdio.h>
/*
循环队列
假溢出问题是顺序队列才有的问题，我们采用取余操作，使得首尾指针front,rear可以到最大值时，再次循环到0，
从而实现循环队列，解决假溢出问题，充分利用空间
front和rear指向第一个元素和最后一个元素所在的位置

 为此：
 如果要区别为空和为满的情况，就需要空一个位置。
 为满：
 front == rear;//此时，为了区别初始情况，front=-1,rear=-1将不合适；
 //应该改为front=0,rear=0;初次插入后rear=1,即rear一直指向最后元素的后一位
 为空： (rear+1)%=front;

*/
#define MAXSIZE 10
//用数组来实现一个队列结构
typedef int ElementType;
typedef struct queue{
    //数据项
    ElementType data[MAXSIZE];
    //地址项
    //两个变量，分别指向数组的首位和末尾（最后元素的后一个位置）
    int front;//指向队首
    int rear;//指向队尾 tail
} SeqQueue;
//2.实现算法
//2.1创建空队列
/*

 * 函数名：createQueue
 * 输入:无
 * 输出/返回值：返回队列 类型SeqQueue
 * */
SeqQueue createQueue(){
    //1.创建空队列
    SeqQueue queue;
    //2.给队列的参数赋初始值
    queue.front=0;
    queue.rear=0;
    return queue;
}
//op1. 判断是否为空 若为空返回1 否则返回0
int isEmpty(SeqQueue *q){
    return q->front ==q->rear;
}

//2.2插入（从尾部进行插入）
/*
* 函数名：EnQueue()/insert
* 输入：被插入的数据结构 队列  被插入的元素 data
* 输出：返回插入是否成功  int
*
* */
int EnQueue(SeqQueue *queue,ElementType data){
    //1.插入的队列已满
    if((queue->rear+1)%MAXSIZE==queue->front){
        printf("队列已经满，无法插入\n");
        return 0;
    }
    //2. 队列不为满
    queue->data[queue->rear]=data;//赋值
    queue->rear=(queue->rear+1)%MAXSIZE;//移动

    return  1;
    //核心操作  先赋值  再移动

}
//2.3删除（从首部删除）
/*
 *
 * 函数名：DeQueue
 * 输入：被删除的队列
 * 输出：被删除的元素
 * */
ElementType DeQueue(SeqQueue *queue){
    //1.队列为空
    if(queue->front==queue->rear){
        printf("队列为空，删除操作无法进行\n");
        return 0;//0代表删除不成功
    }
    //2.队列不为空
    ElementType data= queue->data[queue->front];
    //核心操作 front++
   queue->front=(queue->front+1)%MAXSIZE;
    return data;//被删除队首的元素
}

int main() {
    //创建空队列
    SeqQueue  queue = createQueue();
    //插入
    ElementType data;
    for (int i = 0; i < 5; ++i) {
        scanf("%d",&data);
        EnQueue(&queue,data);

    }
    //删除
    DeQueue(&queue);
    DeQueue(&queue);

    //printf("Hello, World!\n");
    return 0;

}